package com.hzit.aop.proxy.dynamic;

import com.hzit.aop.UserDAO;
import com.hzit.aop.proxy.UserDaoStaticProxyImpl;
import org.aopalliance.intercept.Invocation;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理之-JDK实现
 * 核心点：
 *    一个接口：InvocationHandler
 *    一个类：Proxy
 */
public class JDKUserDaodynamicProxyImpl implements InvocationHandler {
	private UserDAO userDAO;
	public JDKUserDaodynamicProxyImpl(UserDAO userDAO){
		this.userDAO = userDAO;
	}

	//1. 创建代理对象
	//参数说明：
	//参数1：指定当前类的类加载器
	//参数2：指定与目标对象相同接口的Class数组对象
	//参数3：实现了InvocationHandler接口的对象
	public UserDAO createProxy(){
		return (UserDAO) Proxy.newProxyInstance(this.getClass().getClassLoader(),
												userDAO.getClass().getInterfaces(),
												this);
	}

	//2. 当我们调用目标方法时，此方法就会执行
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		//2.1 如果我们调用的是query方法，则首先进行安全性检查。。。
		if(method.getName().equals("query")){
			checkSecurity();
		}
		//2.2 通过反射调用方法
		return method.invoke(userDAO,args);
	}
	private void checkSecurity(){
		System.out.println("【JDK动态代理版本】正在进行安全性检查。。。");
	}
}
